// Variables.h

// Pravdepodobne premenne pre kouca

 
#ifndef VARIABLES_H
#define VARIABLES_H

#include "Player/World/WorldObject.h"

class Variables : public WorldObject
{
	// Specifikuje vzdialenost k brane, od ktorej sa hrac snazi vystrelit na branu (v metroch)
	float distanceToGoal;
	
	// Specifikuje smer strielania v oblasti medzi brankarom, superovymi hracmi a zrdou.
	// Hrac sa snazi standardne vystrelit do stredu volnej oblasti. Stred zodpoveda nulovej hodnote
	// parametra kickToGoalDirection. Avsak toto nemusi byt v kazdej situacii idealne riesenie.
	// Teda hodnota tohto parametra moze byt modifikovana v rozsahu od -100 do 100 (percent), ktory
	// zodpoveda hodnote uhlu od -45 do 45 (stupnov).
	int kickToGoalDirection;
	
	// Specifikuje minimalnu vzdialenost medzi hracom a superom, pri ktorej hrac povazuje stale supera
	// za cast prostredia, o ktorom by mal byt upovedomeny
	float dribleSurroundingsMinWidth; 
	
	// Specifikuje maximalnu vzdialenost medzi hracom a superom, pri ktorej hrac povazuje stale supera
	// za cast prostredia, o ktorom by mal byt upovedomeny
	float dribleSurroundingsMaxWidth;
	
	// Specifikuje minimalnu vzdialenost medzi hracom a spoluhracom, pri ktorej hrac povazuje stale spoluhraca
	// za cast prostredia, do ktoreho sa da nahravat
	float passSurroundingsMinWidth;
	
	// Specifikuje maximalnu vzdialenost medzi hracom a spoluhracom, pri ktorej hrac povazuje stale spoluhraca
	// za cast prostredia, do ktoreho sa da nahravat
	float passSurroundingsMaxWidth;
	
	// Specifikuje prah (minXPosition, maxXPosition), pri ktorej hrac prihrava loptu priamo, namiesto prihravania do behu 
	float minXPosition;
	float maxXPosition;

	// Upravuje hracovu priemernu rychlost behu. Pouziva sa to pre simulovanie pohybov hraca. 
	float friendDashAdjust;
	
	// Upravuje superovu priemernu rychlost behu. Pouziva sa to pre simulovanie pohybov supera. 
	float enemyDashAdjust;
	
	// Ak sa nas hrac dostane k lopte o jeden cyklus skor ako super, povazuje sa za friendBallCtrlBonus krat silnejsieho.
	float friendBallCtrlBonus;
	
	// Ak sa nas hrac dostane k lopte o jeden cyklus skor ako super, povazuje sa za enemyBallCtrlBonus krat silnejsieho.
	float enemyBallCtrlBonus;
	
	// Maximalne tolkoto spoluhracov moze naraz chytat loptu 
	float tooMuchFriendCnt;
	
	// Maximalne tolkoto superov moze naraz chytat loptu 
	float tooMuchEnemyCnt;

	// Pouzit neuronove siete v rozhodovacom strome?
	bool useNeuralNetwork;

public:
	// Konstruktor
	Variables(World* w);
	// Kopirovaci konstruktor
	Variables(const Variables& variables);
	// Destruktor
	virtual ~Variables();
	// Operator priradenia
	virtual Variables& operator =(const Variables&);

	// METODY

	virtual float GetDistanceToGoal() const
	{ 
		return distanceToGoal; 
	}
	virtual void SetDistanceToGoal(float dtg)
	{ 
		distanceToGoal = dtg;
	}

	virtual float GetDribleSurroundingsMinWidth() const
	{ 
		return dribleSurroundingsMinWidth;
	}
	virtual void SetDribleSurroundingsMinWidth(float dsmw)
	{
		dribleSurroundingsMinWidth = dsmw;
	}

	virtual float GetDribleSurroundingsMaxWidth() const
	{
		return dribleSurroundingsMaxWidth;
	}
	virtual void SetDribleSurroundingsMaxWidth(float dsmw)
	{
		dribleSurroundingsMaxWidth = dsmw;
	}
		
	virtual float GetEnemyBallCtrlBonus() const
	{
		return enemyBallCtrlBonus;
	}
	virtual void SetEnemyBallCtrlBonus(float ebcb)
	{
		enemyBallCtrlBonus = ebcb;
	}

	virtual float GetEnemyDashAdjust() const
	{ 
		return enemyDashAdjust;
	}
	virtual void SetEnemyDashAdjust(float eda)
	{
		enemyDashAdjust = eda;
	}

	virtual float GetFriendBallCtrlBonus() const 
	{ 
		return friendBallCtrlBonus; 
	}
	virtual void SetFriendBallCtrlBonus(float fbcb) 
	{ 
		friendBallCtrlBonus = fbcb; 
	}
	
	virtual float GetFriendDashAdjust() const 
	{ 
		return friendDashAdjust; 
	}
	virtual void SetFriendDashAdjust(float fda) 
	{ 
		friendDashAdjust = fda; 
	}

	virtual float GetMinXPosition() const 
	{ 
		return minXPosition; 
	}
	virtual void SetMinXPosition(float mxp) 
	{ 
		minXPosition = mxp; 
	}

	virtual float GetMaxXPosition() const
	{ 
		return maxXPosition; 
	}
	virtual void SetMaxXPosition(float mxp) 
	{ 
		maxXPosition = mxp; 
	}

	virtual int GetKickToGoalDirection() const 
	{ 
		return kickToGoalDirection; 
	}
	virtual void SetKickToGoalDirection(int ktgd) 
	{ 
		kickToGoalDirection = ktgd; 
	}

	virtual float GetPassSurroundingsMinWidth() const 
	{ 
		return passSurroundingsMinWidth; 
	}
	virtual void SetPassSurroundingsMinWidth(float psmw) 
	{
		passSurroundingsMinWidth = psmw; 
	}

	virtual float GetPassSurroundingsMaxWidth() const 
	{ 
		return passSurroundingsMaxWidth; 
	}
	virtual void SetPassSurroundingsMaxWidth(float psmw) 
	{ 
		passSurroundingsMaxWidth = psmw; 
	}

	virtual float GetTooMuchFriendCnt() const 
	{ 
		return tooMuchFriendCnt; 
	}
	virtual void SetTooMuchFriendCnt(float tmfc) 
	{ 
		tooMuchFriendCnt = tmfc; 
	}
	
	virtual float GetTooMuchEnemyCnt() const 
	{ 
		return tooMuchEnemyCnt; 
	}
	virtual void SetTooMuchEnemyCnt(float tmec) 
	{ 
		tooMuchEnemyCnt = tmec; 
	}

	virtual bool GetUseNeuralNetwork() const 
	{ 
		return useNeuralNetwork; 
	}
	virtual void SetUseNeuralNetwork(bool unn = true) 
	{ 
		useNeuralNetwork = unn; 
	}

	// Inicializovanie premennych na standardne hodnoty
	void Initialize();
	// Parsovanie premennej
	bool ParseVariable(const char *name, const char *value);	

};

#endif // VARIABLES_H
